--(1)加锁逻辑
--可重入锁的加锁逻辑
--判断锁是否存在，如果锁不存在，则直接加锁，把重入次数设置为1，给锁增加一个过期的时间
--如果锁存在，判断锁的uuid是否是本线程，如果是本线程，则重入次数加1，并且锁设置一个新的过期时间，如果不是本线程，则返回加锁失败
--KEYS[1]= localName,ARGV[1]=uuid,ARGV[2]=过期时间
-- ==0表示不存在该锁
if(redis.call('exists',KEYS[1]) == 0) then
    redis.call('hincrby',KEYS[1],ARGV[1],1);
    redis.call('pexpire',KEYS[1],ARGV[2]);
    return 1;
end;
if(redis.call('hexists',KEYS[1],ARGV[1]) == 1) then
    redis.call('hincrby',KEYS[1],ARGV[1],1);
    redis.call('pexpire',KEYS[1],ARGV[2]);
    return 1;
else
    return 0;
end;

--(2)可重入锁的释放锁的lua脚本
--判断释放是否是本线程的锁，如果不是，则不需要释放锁
--如果是，那么将可重入次数减一，然后判断值是否大于0，若大于0，则设置一个新的过期时间，如果小于等于0，则删除锁
if(redis.call('hexists',KEYS[1],ARGV[1]) == 0) then
    return 0;
end;
local localCount = redis.call('hincrby', KEYS[1], ARGV[1], -1);
if(localCount > 0) then
    redis.call('pexpire',KEYS[1],ARGV[2]);
    return 1;
else
    redis.call('del',KEYS[1]);
    return 1;
end;

--(3)进行锁续期的逻辑
--判断锁是否存在，如果锁不存在，则返回锁不存在，如果锁存在，判断锁的uuid是否是本线程，如果不是本线程，则返回锁不存在，否则进行锁续期
if(redis.call('hexists',KEYS[1],ARGV[1]) == 0) then
    return 0;
else;
    redis.call('pexpire',KEYS[1],ARGV[2]);
    return 1;
end;


